package main

import (
	"fmt"
	"math"
)

/*
	给一个按非递减顺序排序的整数数组，返回每个数字的平方组成的新数组，要求也按非递减顺序排序
*/
func sortedSquares(nums []int) []int{
	//注意数组中存在负数，要比较负数和正数的绝对值大小
	//先找到数组中第一个非负数
	i :=0

	for ;i<len(nums);i++{
		if(nums[i]>=0){
			break
		}
	}
	//i指向正数，j指向负数
	//防止j溢出
	if i==0{
		//全是正数
		for ;i<=len(nums)-1;i++{
			nums[i] = nums[i]*nums[i]
		}
		return nums
	}
	j := i-1
	//因为想用append函数，所以定义了一个切片
	newArr := make([]int, 0)
	for{
		if i>len(nums)-1{
			//此时正数已经被循环完
			if j<0{
				//此时负数已经被循环完
				break
			}else{
				//剩下的全是负数
				for ;j>=0;j--{
					newArr = append(newArr,nums[j]*nums[j])
				}
				break
			}
		} else if j<0{
			//此时负数已经被循环完
			if i>len(nums)-1{
				//正数已经被循环完
				break
			}else{
				//剩下的全是正数
				for ;i<=len(nums)-1;i++{
					newArr = append(newArr,nums[i]*nums[i])
				}
				break
			}
		}else{
			//正常循环，判断正负数的绝对值，将较小值存入数组
			if math.Abs(float64(nums[i]))>math.Abs(float64(nums[j])){
				//i的绝对值比j大
				newArr = append(newArr,nums[j]*nums[j])
				j--
			}else{
				newArr = append(newArr,nums[i]*nums[i])
				i++
			}
		}
	}
	return newArr
}
func main(){
	nums := []int{-4,-1,0,3,10}
	newNums := sortedSquares(nums)
	fmt.Println(newNums)
	nums1 := []int{-7,-3,2,3,11}
	newNums2 := sortedSquares(nums1)
	fmt.Println(newNums2)
}
